package indi.service;

import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.util.ArrayList;
import indi.entity.Card;
import indi.entity.Student;
import indi.entity.Record;

public class CardService {

	//状态常量
	public static final int NONE = 1;//无借阅
	public static final int BORROWING = 2;//借阅
	public static final int OVERDUE = 3;//逾期
	private static final int ADDERROR = -1;//添加失败标志
	//系统已注册数
	static int COUNTOFREGISTE = 0;
	//当前借阅证列表
	private ArrayList<Card> currentCards;
	
	//构造函数
	public CardService() {
		super();
		this.currentCards = new ArrayList<>();
		//!默认加入一个借阅证
		addCard(new Card(new Student("fang","Law", "本科")));
	}
	
	// 生成一个Card；抽象工厂；防止他人调用Card；
	public Card makeACard(String name, String major) {
		// 根据参数县创建一个学生
		Student student = this.createAStudent(name, major);
		//！先从一开始分配
		Card card = new Card(student);
		// 添加到列表
		this.addCard(card);
		return card;
	}
	
	// 根据学生信息生成一个学生类
	public Student createAStudent(String name, String major) {
		return new Student(name, major);
	}
	// 添加借阅证
	// 注意：此方法不能给外部调用，只能ton过makeACard()调用。
	protected int addCard(Card card) {
		try {
			//计数器+1
			COUNTOFREGISTE++;
			//列表中添加借书证
			currentCards.add(card);
			return card.getId();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return ADDERROR;
	}
	
	//删除借阅证
	public boolean deleteCard(int cardID) {
		try {
			for(int i = 0; i<currentCards.size(); i++) {
				if(currentCards.get(i).getId() == cardID) {
					currentCards.remove(i);
					return true;
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	//更新借阅证
	public boolean updateCard(int cardId) {
		return false;
	}
	//查询借阅证
	public Card queryCard(int cardID) {
		try {
			for(Card e:currentCards) {
				if(cardID == e.getId()) {
					return e;
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	//判断借阅证是否有逾期记录
	public boolean haveOverdueRecord(Card card) {
		
		//获取当前借书证所有借书记录
		ArrayList<Record> currentRecords = card.getCurrentRecords();
		//获取当前时间
		Date now = new Date();
		
		try {
			//遍历记录，判断时间之差是否小于规定时间
			for(Record e:currentRecords) {
				//计算时间差=现在日期-书本上次借阅时期
				int diffrentDays =now.getDay() - e.getBorrowTime().getDay();
				//判断时间差是否小于规定时间
				if(diffrentDays > TitleService.MAINTAINDAYS) {
					return true;
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	//判断借阅证借书是否达到上限
	public boolean isReachUpperLimit(Card card) {
		return (card.getCurrentRecords().size() >= TitleService.UPPERLIMIT);
	}

	public static int getCOUNTOFREGISTE() {
		return COUNTOFREGISTE;
	}
	
	//为当前借阅证添加一条借书记录
	public boolean addOneRecord(Card card, Record record) {
		
		try {
			//添加一条借阅记录
			card.getCurrentRecords().add(record);
			//置借阅证状态为【借阅】
			card.setCurrentStatues(this.BORROWING);
			
		}catch(Exception e) {
			throw e;
		}
		return true;
	}
	
	//删除一条借阅记录
	public boolean deleteRecord(Card card, Record record) {
		try {
			//移除记录
			card.getCurrentRecords().remove(record);
			//判断借阅证状态是否回到【无借阅】
			if(0 == card.getCurrentRecords().size()) {
				card.setCurrentStatues(this.NONE);
			}
		}catch(Exception e) {
			throw e;
		}
		return true;//?是否删掉记录对象；要不换成set。不用
	}
	
	// 存入数据库
	
	// 从数据库读取
	
	public void outputCards(ArrayList<Card> cards) {
		for(Card e: cards) {
			System.out.println(e.toString());
		}
		System.out.println("输出完成！");
	}
	
	

	/**
	 * @return the currentCards
	 */
	public ArrayList<Card> getCurrentCards() {
		return currentCards;
	}
}
